using System;
using System.Collections.Generic;
using System.Text;
using xWinFormsLib;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using pds2.XArena;

namespace QuizArena
{
    class AssuntosForm : Form
    {
        private Label lblNomeAssunto;
        private Label lblNomeTema;
        private Textbox txtNomeAssunto;
        private TextButton btnAdicionar;
        private TextButton btnConfirmar;
        private TextButton btnCancelar;
        private TextButton btnRemover;
        private TextButton btnAlterar;
        private List<Assunto> assuntos;
        private List<Pergunta> perguntas;
        private List<Tema> temas;
        private Listbox ltbAssuntos;
        private Combo ddlTemas;

        private void CarregarXml()
        {
            assuntos = XMLUtils.ObterLista<Assunto>();
            temas = XMLUtils.ObterLista<Tema>();

            ddlTemas.Clear();
            foreach (Tema tema in temas)
            {
                ddlTemas.AddItem(tema.Nome);
            }

            foreach (Assunto assunto in assuntos)
            {
                ltbAssuntos.AddItem(assunto.Nome);
            }
            
        }

        public AssuntosForm(Tela telaPai)
            : base(
            new Vector2(230, 150),
            //new Vector2(225, 135),
            //FormUtils.obterPosicaoForm(FormUtils.TamanhoForm.Grande),
            FormUtils.obterTamanhoForm(FormUtils.TamanhoForm.Grande),
            "Assuntos",
            Color.PowderBlue,
            Color.DarkBlue,
            ConteinerAuxiliar.fontePadrao,
            1f,
            false,
            false,
            false,
            false,
            BorderStyle.None,
            Style.Default, null, telaPai)
        {
            lblNomeTema = new Label("lblNomeTema", new Vector2(40, 40), "Tema", Label.Alignment.Center, null, Color.DarkBlue, font);
            Add(lblNomeTema);

            ddlTemas = new Combo("ltbTema", new Vector2(40, 60), 100, font, Form.Style.Default);
            Add(ddlTemas);

            lblNomeAssunto = new Label("lblNomeAssunto", new Vector2(40, 80), "Assunto", Label.Alignment.Center, null, Color.DarkBlue, font);
            Add(lblNomeAssunto);

            txtNomeAssunto = new Textbox("txtNomeAssunto", new Vector2(40, 100), 120, null, "", "", 255, false, false, font, Style.Default);
            Add(txtNomeAssunto);

            ltbAssuntos = new Listbox("ltbAssuntos", new Vector2(40, 120), new Point(130, 130), Color.Beige, Color.White, font);
            ltbAssuntos.OnChangeSelection += new EventHandler(ltbAssuntos_OnChangeSelection);
            Add(ltbAssuntos);

            btnAdicionar = new TextButton("btnAdicionar", new Vector2(280, 90), "Adicionar", 80, Color.White, font, Form.Style.Default);
            btnAdicionar.OnPress += new EventHandler(btnAdicionar_OnPress);
            Add(btnAdicionar);

            btnRemover = new TextButton("btnRemover", new Vector2(280, 130), "Remover", 80, Color.White, font, Form.Style.Default);
            btnRemover.OnPress += new EventHandler(btnRemover_OnPress);
            Add(btnRemover);

            btnAlterar = new TextButton("btnAlterar", new Vector2(280, 170), "Alterar", 80, Color.White, font, Form.Style.Default);
            btnAlterar.OnPress += new EventHandler(btnAlterar_OnPress);
            Add(btnAlterar);

            btnConfirmar = new TextButton("btnConfirmar", new Vector2(150, 280), "OK", null, Color.White, font, Form.Style.Default);
            btnConfirmar.OnPress += new EventHandler(btnConfirmar_OnPress);
            Add(btnConfirmar);

            btnCancelar = new TextButton("btnCancelar", new Vector2(230, 280), "Cancelar", null, Color.White, font, Form.Style.Default);
            btnCancelar.OnPress += new EventHandler(btnCancelar_OnPress);
            Add(btnCancelar);

            CarregarXml();

        }

        void btnAdicionar_OnPress(object obj, EventArgs e)
        {
            if (!txtNomeAssunto.Text.Trim().Equals(String.Empty))
            {
                Assunto umAssunto = new Assunto();
                umAssunto.Nome = txtNomeAssunto.Text;
                umAssunto.Tema = temas.Find(new Predicate<Tema>(IsTemaSelecionado));
                assuntos.Add(umAssunto);
                
                XMLUtils.SalvarLista<Assunto>(assuntos);

                txtNomeAssunto.Text = String.Empty;
                ltbAssuntos.Clear();

                foreach (Assunto Assunto in assuntos)
                {
                    ltbAssuntos.AddItem(Assunto.Nome);
                }
            }
        }

        void btnRemover_OnPress(object obj, EventArgs e)
        {
            Assunto umAssunto = new Assunto();
            umAssunto.Nome = txtNomeAssunto.Text;

            perguntas = XMLUtils.ObterLista<Pergunta>();

            int count = perguntas.Count - 1;
            for (int i = count; i >= 0; i--)
            {
                if (perguntas[i].Assunto.Nome.Equals(umAssunto.Nome))
                {
                    perguntas.RemoveAt(i);
                }
            }
            assuntos.RemoveAt(ltbAssuntos.IndexOf(ltbAssuntos.SelectedItem));
            txtNomeAssunto.Text = String.Empty;
            ltbAssuntos.RemoveItem(umAssunto.Nome);

            XMLUtils.SalvarLista<Pergunta>(perguntas);
            XMLUtils.SalvarLista<Assunto>(assuntos);
        }

        void btnCancelar_OnPress(object obj, EventArgs e)
        {
            Hide();
            telaPai.SairDaTela();
        }

        void btnConfirmar_OnPress(object obj, EventArgs e)
        {
            Hide();
            telaPai.SairDaTela();
        }

        void btnAlterar_OnPress(object obj, EventArgs e)
        {
            if (!txtNomeAssunto.Text.Trim().Equals(String.Empty) && !ltbAssuntos.selectedItem.Equals(String.Empty))
            {
                Assunto umAssunto = assuntos.Find(new Predicate<Assunto>(IsAssuntoSelecionado));
                int countAssunto = assuntos.Count - 1;
                for (int i = countAssunto; i >= 0; i--)
                {
                    if (assuntos[i].Nome.Equals(umAssunto.Nome))
                    {
                        assuntos.RemoveAt(i);
                        umAssunto.Nome = txtNomeAssunto.Text;
                        assuntos.Insert(i, umAssunto);
                    }
                }

                XMLUtils.SalvarLista<Assunto>(assuntos);

                ltbAssuntos.Clear();
                txtNomeAssunto.Text = String.Empty;
                foreach (Assunto assunto in assuntos)
                {
                    ltbAssuntos.AddItem(assunto.Nome);
                }
            }
        }

        void ltbAssuntos_OnChangeSelection(object obj, EventArgs e)
        {
            if (!ltbAssuntos.SelectedItem.Equals(String.Empty))
            {
                Assunto umAssunto = new Assunto();
                umAssunto = assuntos.Find(new Predicate<Assunto>(IsAssuntoSelecionado));
                txtNomeAssunto.Text = umAssunto.Nome;
                ddlTemas.SelectedItem = umAssunto.Tema.Nome;
            }
        }

        private bool IsTemaSelecionado(Tema tema)
        {
            return tema.Nome.Equals(ddlTemas.SelectedItem);
        }

        private bool IsAssuntoSelecionado(Assunto assunto)
        {
            return assunto.Nome.Equals(ltbAssuntos.selectedItem);
        }
    }
}
